﻿using System;
using Heaven.Graphics;

namespace Heaven.Graphics
{
    /// <summary>
    /// Объявление входных вершинных данных для конвейера
    /// </summary>
    public struct VertexElement
    {
        private static VertexElement _none = new VertexElement(-1, -1, DeclarationType.Unused, 
                                                                       DeclarationMethod.Default, 
                                                                       DeclarationUsage.Normal, 0);

        /// <summary>
        /// Номер потока
        /// </summary>
        public short Stream;
        /// <summary>
        /// Смещение от начала потока 
        /// к началу данных
        /// </summary>
        public short Offset;
        /// <summary>
        /// Один или несколько предопределенных 
        /// типов определяющих размер данных
        /// </summary>
        public DeclarationType DeclarationType;
        /// <summary>
        /// Метод обработки тесселятором. 
        /// Этот метод определяет как тесселятор 
        /// будет интерпретировать/оперировать 
        /// вершинными данными
        /// </summary>
        public DeclarationMethod DeclarationMethod;
        /// <summary>
        /// Определение предназначения данных
        /// </summary>
        public DeclarationUsage DeclarationUsage;
        /// <summary>
        /// Модификация использования данных для 
        /// позволения пользователю устанавливать 
        /// множественные типы использования
        /// </summary>
        public byte UsageIndex;

        /// <summary>
        /// Конструктор объекта
        /// </summary>
        /// <param name="stream">Номер потока</param>
        /// <param name="offset">Смещение от начала потока к началу данных</param>
        /// <param name="declarationType">Один или несколько предопределенных типов определяющих размер данных</param>
        /// <param name="declarationMethod">Метод обработки тесселятором</param>
        /// <param name="declarationUsage">Определение предназначения данных</param>
        /// <param name="usageIndex">одификация использования данных для позволения пользователю устанавливать множественные типы использования</param>
        public VertexElement(short stream, short offset, DeclarationType declarationType, DeclarationMethod declarationMethod,
            DeclarationUsage declarationUsage, byte usageIndex)
        {
            Stream = stream;
            Offset = offset;
            DeclarationType = declarationType;
            DeclarationMethod = declarationMethod;
            DeclarationUsage = declarationUsage;
            UsageIndex = usageIndex;
        }

        /// <summary>
        /// Пустой/незначащий объект
        /// </summary>
        public static VertexElement None
        {
            get
            {
                return _none;
            }
        }
    }
}
